/**
 * 
 */
package join.web.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import join.model.beans.Proyecto;
import join.model.beans.ProyectoCosto;
import join.model.beans.ProyectoPago;
import join.model.repositories.ProyectoCostoRepository;
import join.model.repositories.ProyectoPagoRepository;
import join.model.repositories.ProyectoRepository;
import join.util.AppListUtil;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

/**
 * @author Cesar Rodriguez
 *
 */

@Controller
@RequestMapping("/proyecto/{id}/pago")
public class ProyectoPagoController {
	@Autowired
	ProyectoRepository proyectoRepo;
	
	@Autowired
	ProyectoPagoRepository proyectoPagoRepo;
	
	@Autowired
	ProyectoCostoRepository proyectoCostoRepo;
	
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public ModelAndView lstCosto(HttpServletRequest request, 
			HttpServletResponse response,  @PathVariable Long id) throws Exception {
		
		Proyecto p = proyectoRepo.findOne(id);
		List<ProyectoPago> lp = (List<ProyectoPago>) proyectoPagoRepo.findByProyecto(id);
		
		Map<String, Object> model = new HashMap<String, Object>();
		model.put("proyecto", p);
		model.put("list", lp);

		return new ModelAndView("project/proyectoPagoLst", "model", model);
	}
	
	@RequestMapping(value = "/costo/{idCosto}/preload", method = RequestMethod.GET)
	public ModelAndView preload(ModelMap model, @PathVariable Long id, @PathVariable Long idCosto){
		ProyectoPago proyectoPago = new ProyectoPago();
		
		Proyecto p = proyectoRepo.findOne(id);
		proyectoPago.setProyecto(id);
		proyectoPago.setProyectoCosto(idCosto);
		
		ProyectoCosto proyectoCosto = proyectoCostoRepo.findOne(idCosto);
		
		//Objetos Principales
		model.put("proyecto", p);
		model.put("proyectoPago", proyectoPago);
		model.put("proyectoCosto", proyectoCosto);
		
		//Listas
		loadLists(model);
		
		return new ModelAndView("project/proyectoPagoAdm", "model", model);
	}

	@RequestMapping(value = "/{idPago}/load", method = RequestMethod.GET)
	public ModelAndView load(ModelMap model, @PathVariable Long id, @PathVariable Long idPago){
		Proyecto p = proyectoRepo.findOne(id);
		ProyectoPago proyectoPago = proyectoPagoRepo.findOne(idPago);
		ProyectoCosto proyectoCosto = proyectoCostoRepo.findOne(proyectoPago.getProyectoCosto());

		//Objetos Principales
		model.put("proyecto", p);
		model.put("proyectoPago", proyectoPago);
		model.put("proyectoCosto", proyectoCosto);
		
		//Listas
		loadLists(model);
				
		return new ModelAndView("project/proyectoPagoAdm", "model", model);
	}
	
	@RequestMapping(value = "/save", method = RequestMethod.POST)
	public ModelAndView save(@ModelAttribute("proyectoPago") ProyectoPago nuevoPago,  
			ModelMap model, HttpServletRequest request,
			HttpServletResponse response, @PathVariable Long id) throws Exception{
		
		nuevoPago.setProyecto(id);
		proyectoPagoRepo.save(nuevoPago);
		
		//Actualizar el valor de la cuenta
		ProyectoCosto proyectoCosto = proyectoCostoRepo.findOne(nuevoPago.getProyectoCosto());
		List<ProyectoPago> list = proyectoPagoRepo.findByProyectoAndProyectoCosto(nuevoPago.getProyecto(), nuevoPago.getProyectoCosto());
		
		double sum = 0;
		
		for (ProyectoPago pp : list) {
			if ("P".equalsIgnoreCase(pp.getEstado())){
				sum += pp.getValorNeto();
			}
		}
		
		proyectoCosto.setValorEjecutado(sum);
		proyectoCostoRepo.save(proyectoCosto);
		
		return load(model, id, nuevoPago.getId());
	}
	
	/*
	 * Carga de listas al modelo
	 */
	private void loadLists (ModelMap model){
		model.put("lpEstado", AppListUtil.getLista("proyectoPagoEstado"));
		model.put("lpTipoReferencia", AppListUtil.getLista("proyectoPagoTipoReferencia"));
	}
}